package com.yunpeng.aidevice.dao.mapper.entity;

import com.yunpeng.aidevice.dao.mapper.IEntityMapper;
import com.yunpeng.aidevice.dao.model.entity.OrganizationDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * <p>
 * 组织机构 Mapper 接口
 * </p>
 *
 * @author hemw
 * @since 2020-04-07
 */
@Mapper
public interface OrganizationMapper extends IEntityMapper<OrganizationDO> {

    /**
     * 根据节点路径获取路径
     *
     * @param nodePath     节点全路径
     * @param isRoot       是否根节点
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @return
     */
    OrganizationDO getByPath(@Param(value = "nodePath") String nodePath, @Param(value = "isRoot") Boolean isRoot, @Param("merchantCode") String merchantCode, @Param("tenantCode") String tenantCode);


    /**
     * 根据节点路径获取节点集合
     *
     * @param nodePath     节点全路径
     * @param containSelf  是否包含本身
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @return
     */
    List<OrganizationDO> queryListByPath(@Param(value = "nodePath") String nodePath, @Param("containSelf") Boolean containSelf, @Param("merchantCode") String merchantCode, @Param("tenantCode") String tenantCode);

    /**
     * 删除节点
     *
     * @param code 节点代码
     */
    void deleteByCode(@Param("code") String code);

    /**
     * 统计同个租户、同个商户下组织编号是否存在
     *
     * @param number
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @return
     */
    Integer countNumberExists(@Param("number") String number, @Param("merchantCode") String merchantCode, @Param("tenantCode") String tenantCode);

    /**
     * 统计同个租户、同个商户下组织编号是否存在，排除指定代码
     *
     * @param number
     * @param code
     * @param merchantCode
     * @param tenantCode
     * @return
     */
    Integer countNumberExistsExcludeCode(@Param("number") String number, @Param("code") String code, @Param("merchantCode") String merchantCode, @Param("tenantCode") String tenantCode);

    /**
     * 更新组织和其下属组织路径
     *
     * @param newPath    当前组织新路径
     * @param originPath 当前组织老路径
     */
    void updatePath(@Param("newPath") String newPath, @Param("originPath") String originPath);

    /**
     * 禁用组织及其下级
     *
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @param nodePath
     * @param disabled
     * @return
     */
    void disableEnableChild(@Param("disabled") Boolean disabled, @Param("merchantCode") String merchantCode, @Param("tenantCode") String tenantCode, @Param("nodePath") String nodePath);

    /**
     * 根据编号获取组织机构
     *
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @param number
     * @return
     */
    OrganizationDO getByNumber(@Param("merchantCode") String merchantCode, @Param("tenantCode") String tenantCode, @Param("number") String number);

    /**
     * 根据编号列表获取集合
     *
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @param numbers
     * @return
     */
    List<OrganizationDO> getByNumbers(@Param("merchantCode") String merchantCode, @Param("tenantCode") String tenantCode, @Param("numbers") List<String> numbers);

    /**
     * 根据代码列表获取集合
     *
     * @param merchantCode 商户代码
     * @param tenantCode   租户代码
     * @param codes
     * @return
     */
    List<OrganizationDO> getByCodes(@Param("merchantCode") String merchantCode, @Param("tenantCode") String tenantCode, @Param("codes") List<String> codes);

}
